/** ==================================================================================== **/
/**  						GESTIONE CONTROLLI COSTRUTTORE : ol.control 				 **/
/** ==================================================================================== **/


/**
 * Service: ControlsBuilder 
 * 
 * Inherits from:
 *  - <ol.Control>
 *
 * Uso:
 *  (code)
 *    var map = ...
 *    var control = olControlService.<nome_function>(<param>);
 *    map.addControl(control);
 *  (end)
 */
BootApplication.service("olControlService", [ '$log', '$translate', 'olFormatService', function( $log, $translate, olFormatService ) {
	
	/**
	 * Serie di controlli inclusi nelle mappe per impostazione predefinita. A meno che non configurato altrimenti,
	 * restituisce un insieme contenente un'istanza di ciascuno dei seguenti controlli:
	 * 
	 *   - ol.control.Rotate
	 *   - ol.control.Attribution
	 *   - ol.control.Zoom
	 *   
	 *  @param {@link MapOptions} options
	 */
	this.createOlControlDefaults = function(options) {
		
		/**
		 * Controllo per mostrare tutti gli attributi associati con le fonti di livello nella mappa. 
		 * (es : la scritta contributors di open street map)
		 * Questo controllo è uno dei controlli predefiniti inclusi nelle mappe. Di default mostrerà nella parte in basso a 
		 * destra della mappa, ma questo può essere modificato tramite un selettore CSS per ".ol-attribution" .
		 */
		var attributionOptions = {
			  /** CSS class name. Default is ol-attribution. **/
			  className: "ol-attribution",
			  /** Target. **/
//			  target: "",
			  /** Specify if attributions can be collapsed. If you use an OSM source, should be set to false — see OSM Copyright — Default is true. **/
			  collapsible: false,
			  /** Specify if attributions should be collapsed at startup. Default is true. **/
			  collapsed: true,
			  /** Text label to use for the button tip. Default is Attributions **/
			  tipLabel: $translate.instant('OpenLayers.attributions.tipLabel'),
			  /** Text label to use for the collapsed attributions button. Default is i. Instead of text, also a Node (e.g. a span element) can be used. **/
			  label: "i"
			  /** Text label to use for the expanded attributions button. Default is ». Instead of text, also a Node (e.g. a span element) can be used. **/
//			  collapseLabel: "",
			  /** Function called when the control should be re-rendered. This is called in a requestAnimationFrame callback. **/
//			  render: ""
		  };
		
		/**
		 * Un controllo pulsante per ripristinare la rotazione a 0. Per lo stile questo uso di controllo selettore CSS .ol-rotate. 
		 * Un selettore CSS .ol-hidden viene aggiunto al pulsante quando la rotazione è 0.
		 * Strumento attivabile con la combinazione ALT + SHIFT + Drag to rotate.
		 */
		var rotateOptions = {
			  /** CSS class name. Default is ol-rotate. **/
			  className: "ol-rotate",
			  /** Text label to use for the rotate button. Default is ⇧. Instead of text, also a Node (e.g. a span element) can be used. **/
//			  label: "",
			  /** Text label to use for the rotate tip. Default is Reset rotation **/
			  tipLabel: $translate.instant('OpenLayers.rotateOptions.tipLabel'),
			  /** Animation duration in milliseconds. Default is 250. **/
			  duration: 250,
			  /** Hide the control when rotation is 0. Default is true. **/
			  autoHide: true
			  /** Function called when the control should be re-rendered. This is called in a requestAnimationFrame callback. **/
//			  render: "",
			  /** Target. **/
//			  target: ""
		  };
		
		/**
		 * Un controllo con 2 pulsanti, uno per lo zoom in e una per lo zoom out. Questo controllo è uno dei controlli predefiniti di una mappa. 
		 * Per stile di questo uso di controllo selettori CSS .ol-zoom-in e .ol-zoom-out.
		 */
		var zoomOptions = {
			  /** Animation duration in milliseconds. Default is 250. **/
			  duration: 250,
			  /** CSS class name. Default is ol-zoom. **/
			  className: "ol-zoom",
			  /** Text label to use for the zoom-in button. Default is +. Instead of text, also a Node (e.g. a span element) can be used. **/
			  zoomInLabel: "+",
			  /** Text label to use for the zoom-out button. Default is -. Instead of text, also a Node (e.g. a span element) can be used. **/
			  zoomOutLabel: "-",
			  /** Text label to use for the button tip. Default is Zoom in **/
			  zoomInTipLabel: $translate.instant('OpenLayers.zoomOptions.zoomInTipLabel'),
			  /** Text label to use for the button tip. Default is Zoom out **/
			  zoomOutTipLabel: $translate.instant('OpenLayers.zoomOptions.zoomOutTipLabel')
			  /** The zoom delta applied on each click. **/
//			  delta: "",
			  /** Target. **/
//			  target: ""
		  };
		
		/**
		 * ol.control.defaults(opt_options){ol.Collection.<ol.control.Control>} 
		 */
		var olControlDefault = ol.control.defaults({
			  /** Attribution. Default is true. **/
			  attribution: options.isEnableAttribution(),
			  /** Attribution options. **/
			  attributionOptions: attributionOptions,
			  /** Rotate. Default is true. **/
			  rotate: options.isEnableRotation(),
			  /** Rotate options **/
			  rotateOptions: rotateOptions,
			  /** Zoom. Default is false. **/
			  zoom: options.isEnableZoom(),
			  /** Zoom options. **/
			  zoomOptions: zoomOptions
		  });
			 
		return olControlDefault; 
	}// createOlControlDefaults
	
	/**
	 * Fornisce un pulsante che se cliccato riempie l'intero schermo con la mappa. Quando in modalità a schermo intero, 
	 * un pulsante di chiusura viene mostrato per uscire dalla modalità a schermo intero. 
	 * L'API a tutto schermo viene utilizzato per attivare o disattivare la mappa in modalità a schermo intero.
	 * 
	 * @param {@link MapOptions} options
	 */
	this.createFullscreenControl = function(options) {
		
		var label = angular.element("<span>" +
										"<i class='fa fa-arrows-alt' aria-hidden='true'></i>" +
										(options.getAdvancedControlHasLabel() ? $translate.instant('OpenLayers.fullScreen.label') : "") +
									"</span>");
		
		var labelActive = angular.element("<span>" +
											"<i class='fa fa-arrows-alt' aria-hidden='true'></i>" +
											(options.getAdvancedControlHasLabel() ? $translate.instant('OpenLayers.fullScreen.label') : "") +
										  "</span>");
		
		
		var fullScreen = new ol.control.FullScreen({
				/** CSS class name. Default is ol-full-screen. **/
				className: "ol-full-screen",
				/** Text label to use for the button. Default is \u2194 (an arrow). Instead of text, also a Node (e.g. a span element) can be used. **/
				label: label[0],
				/** Text label to use for the button when full-screen is active. Default is \u00d7 (a cross).  **/
				labelActive: labelActive[0],
				/** Text label to use for the button tip. Default is Toggle full-screen **/
				tipLabel: $translate.instant('OpenLayers.fullScreen.tipLabel'),
				/** Full keyboard access. **/
//				keys: "",
				/** Identificativo dell'elemento HTML in cui openalyer inserirà l'html del controllo. */
				target: options.getControlTargetId(),
				/** 
				 * L'elemento da visualizzare a schermo intero. Quando non è previsto, l'elemento che contiene la mappa viewport verrà 
				 * visualizzato a schermo intero.
				 */
				source: options.getFullscreenSourceId()
			});
		  
		return fullScreen;
	}// createFullscreenControl
	
	/**
	 * Un controllo per mostrare le coordinate 2D del cursore del mouse. Per default, questi sono nella proiezione della mappa, 
	 * ma possono essere in qualsiasi proiezione supportata. Per impostazione predefinita, il controllo viene mostrata 
	 * nell'angolo in alto a destra della mappa, ma questo può essere modificato utilizzando il selettore CSS .ol-mouse-position.
	 * 
	 * @param {@link MapOptions} options
	 */
	this.createMousePositionControl = function(options) {
		
		var mousePosition = new ol.control.MousePosition({
				/** CSS class name. Default is ol-mouse-position. **/
				className: "ol-mouse-position ol-control",
				/** Coordinate format (precisione) **/
				coordinateFormat: function(coordinate) {
					return ol.coordinate.format(coordinate, $translate.instant('OpenLayers.mousePosition.tipLabel') + ': {x} , {y}', 4);
				},
				/** Projection. **/
				projection: options.getSourceProjection(),
				/** Function called when the control should be re-rendered. This is called in a requestAnimationFrame callback. **/
//				render: "",
				/** Target. **/
//				target: "",
				/** Markup for undefined coordinates. Default is `` (empty string). **/
				undefinedHTML: $translate.instant('OpenLayers.mousePosition.tipLabel') + ": "
			});
		  
		return mousePosition;
	}// createMousePositionControl
	
	/**
	 * Un controllo pulsante che, se premuto, cambia la visualizzazione della mappa in misura specifica. 
	 * Per stile di questo controllo utilizzare il selettore CSS .ol-zoom-extent.
	 * 
	 * @param {@link MapOptions} options
	 */
	this.createZoomToExtentControl = function(options) {
		
		var label = angular.element("<span>" +
										"<i class='fa fa-zoom-extent' aria-hidden='true'></i>" +
										(options.getAdvancedControlHasLabel() ? $translate.instant('OpenLayers.zoomToExtent.label') : "") +
									"</span>");

		var zoomToExtent = new ol.control.ZoomToExtent({
				/** Class name. Default is ol-zoom-extent. **/
			  	className: "ol-zoom-extent",
			  	/** Identificativo dell'elemento HTML in cui openalyer inserirà l'html del controllo. */
				target: options.getControlTargetId(),
			  	/** Text label to use for the button. Default is E. Instead of text, also a Node (e.g. a span element) can be used. **/
			  	label: label[0],
			  	/** Text label to use for the button tip. Default is Zoom to extent **/
			  	tipLabel: $translate.instant('OpenLayers.zoomToExtent.tipLabel'),
			  	/** The extent to zoom to. If undefined the validity extent of the view projection is used. **/
			  	extent: olFormatService.olProjTransformExtent(options.getExtent(), options.getSourceProjection(), options.getDestProjection())
			});
		 
		return zoomToExtent;
	}// createZoomToExtentControl
	
	/**
	 * Un controllo pulsante che, se premuto, attiva/disattiva la visualizzazione della mappa in 3D/2D. 
	 * Per stile di questo controllo utilizzare il selettore CSS .ol-3d.
	 * 
	 * @param {@link olcs.OLCesium} olMap3D
	 * @param {@link MapOptions} options
	 */
	this.create3DControl = function (olMap3D, options) {
		
		var label = angular.element("<span>" +
										"<i class='fa fa-globe' aria-hidden='true'></i>" +
										(options.getAdvancedControlHasLabel() ? $translate.instant('OpenLayers.ol3DControl.label') : "") +
									"</span>");
		
		var ol3D = new mycontrol.ol3DControl({
				/**  Class name. **/
				className: "ol-3d",
				/** Text label to use for the button. Default is icon. Instead of text, also a Node (e.g. a span element) can be used. **/
			  	label: label[0],
				/** Text label to use for the button tip. Default is 3D **/
				tipLabel: $translate.instant('OpenLayers.ol3DControl.tipLabel'),
				/** Instanza della mappa 3D **/
		  		map: olMap3D,
		  		/** Identificativo dell'elemento HTML in cui openalyer inserirà l'html del controllo. */
				target: options.getControlTargetId()
			});
		
		return ol3D;
	}// close create3DControl
	
	/**
	 * Un controllo pulsante che, se premuto, attiva/disattiva la visualizzazione dell'albero dei layer 
	 * Per stile di questo controllo utilizzare il selettore CSS .ol-layers.
	 * 
	 * @param {@link String} classname
	 *  @param {@link String} placement, direction tooltip
	 */
	this.createLayerTreeControl = function (classname, placement) {
		
		var layerTree = new mycontrol.olLayersTreeControl({
				/**  Class name. **/
				className: classname,
				/** Text label to use for the button tip. Default is "Albero dei layer" **/
				tipLabel: $translate.instant('OpenLayers.olLayersControls.tipLabel'),
				/** Which direction would you like the tooltip to go? Supports left, right, top, and bottom. Default è top. **/
				placementTooltip: placement
			});
		
		return layerTree;
	}// close createLayerTreeControl
	
	/**
	 * Creare un nuovo controllo con una mappa in qualità di una mappa panoramica per un'altra mappa definita.
	 */
	this.createOverviewMapControl = function (options) {
		
		var overviewMap = new ol.control.OverviewMap({
			  /**  Whether the control should start collapsed or not (expanded). Default to true. **/
			  collapsed: true,
			  /** Text label to use for the expanded overviewmap button. Default is «. Instead of text, also a Node (e.g. a span element) can be used. **/
			  collapseLabel: "»",
			  /** Whether the control can be collapsed or not. Default to true. **/
			  collapsible: true,
			  /**  Text label to use for the collapsed overviewmap button. Default is ». Instead of text, also a Node (e.g. a span element) can be used. **/
			  label: "«",
			  target: options.getControlTargetId(),
			  /** Layers for the overview map. If not set, then all main map layers are used instead. **/
//			  layers: null,
			  /** Function called when the control should be re-rendered. This is called in a requestAnimationFrame callback. **/
//			  render: "",
			  /** Specify a target if you want the control to be rendered outside of the map's viewport. **/
//			  target: "",
			  /** Text label to use for the button tip. Default is Overview map **/
			  tipLabel: $translate.instant('OpenLayers.overviewMap.tipLabel')
		  });
		
		return overviewMap;
	}// close createOverviewMapControl
	
	/**
	 * Un controllo che visualizza distanze x assi grezze, calcolato per il centro della finestra. 
	 * Nessuna linea scala verrà mostrata quando la distanza asse x non può essere calcolato nella proiezione vista (ad esempio in corrispondenza o 
	 * al di là dei poli in EPSG: 4326). Per impostazione predefinita, la linea di scala mostrerà nella parte in basso a sinistra della mappa, 
	 * ma questo può essere modificato utilizzando il selettore CSS .ol-scale-line .
	 */
	this.createScaleLineControl = function () {
	
		var scaleLine = new ol.control.ScaleLine({
			  /** CSS Class name. Default is ol-scale-line. **/
			  className: "ol-scale-line",
			  /**  Minimum width in pixels. Default is 64. **/
			  minWidth: 64,
			  /** Function called when the control should be re-rendered. This is called in a requestAnimationFrame callback. **/
//			  render: "",
			  /** Target. **/
//			  target: "",
			  /**  Units. Default is metric. Units for the scale line. Supported values are 'degrees', 'imperial', 'nautical', 'metric', 'us'. **/
			  units: "metric"
		  });
			
		return scaleLine;
	}// close createScaleLineControl
	
	/**
	 * Un controllo con 2 pulsanti, uno per lo zoom in e una per lo zoom out. Questo controllo è uno dei controlli predefiniti di una mappa. 
	 * Per stile di questo uso di controllo selettori CSS .ol-zoom-in e .ol-zoom-out.
	 */
	this.createZoomControl = function () {
		
		var zoom = new ol.control.Zoom({
				/** Animation duration in milliseconds. Default is 250. **/
				duration: 250,
				/** CSS class name. Default is ol-zoom. **/
				className: "ol-zoom",
				/** Text label to use for the zoom-in button. Default is +. Instead of text, also a Node (e.g. a span element) can be used. **/
				zoomInLabel: "+",
				/** Text label to use for the zoom-out button. Default is -. Instead of text, also a Node (e.g. a span element) can be used. **/
				zoomOutLabel: "-",
				/** Text label to use for the button tip. Default is Zoom in **/
				zoomInTipLabel: $translate.instant('OpenLayers.zoomOptions.zoomInTipLabel'),
				/** Text label to use for the button tip. Default is Zoom out **/
				zoomOutTipLabel: $translate.instant('OpenLayers.zoomOptions.zoomOutTipLabel')
				/** The zoom delta applied on each click. **/
//				delta: "",
				/** Target. **/
//				target: ""
			});
		
		return zoom;
	}// close createZoomControl
	
	/**
	 * Un controllo con 2 pulsanti, uno per lo zoom in e una per lo zoom out e lo slider centrale per spostarsi direttamente 
	 * ad un certo livello di zoom.
	 */
	this.createZoomSliderControl = function () {
		
		var zoomSlider = new ol.control.ZoomSlider({
			  /** CSS class name. **/
//			  className: "",	
			  /**  Animation duration in milliseconds. Default is 200. **/
			  duration: 200,
			  /** Maximum resolution. **/
//			  maxResolution: "",
			  /** Minimum resolution. **/
//			  minResolution: "",
			  /** Function called when the control should be re-rendered. This is called in a requestAnimationFrame callback. **/
//			  render: ""
		});
		  
		return zoomSlider;
	}// close createZoomSliderControl
	
	/** 
	 * Il controllo LayerSwitcher visualizza una tabella di contenuti per la mappa. In questo modo l'utente può passare da
	 * BaseLasyers ad un'altro e mostrare o nascondere sovrapposizioni. 
	 * Per impostazione predefinita, lo switcher è mostrato minimizzato sul bordo destro della mappa, l'utente può espandere cliccando sulla maniglia.
	 */
	this.createLayerSwitcherControl = function () {
		
		var switcher = new mycontrol.LayerSwitcher({
				/* Text label to use for the button tip. Default is "Legend" **/
				tipLabel: $translate.instant('OpenLayers.olSwitcher.tipLabel'),
				/* Testo dell'etichetta da utilizzare per identificare i layer di base. Il valore predefinito è 'Base Layer'.*/
				baseLabel: $translate.instant('OpenLayers.olSwitcher.baseLabel'),
				/* Testo dell'etichetta da utilizzare per identificare i layer non di base. Il valore predefinito è 'Overlay'. */
				overlayLabel: $translate.instant('OpenLayers.olSwitcher.overlayLabel')
			});
		
		return switcher;
	}// close createLayerSwitcherControl
	
	/** 
	 * Un controllo pulsante che, se premuto, viene individuata la posizione di un utente.
	 */
	this.createGeolocationControl = function (options) {
		
		var label = angular.element("<span>" +
										"<i class='fa fa-location-arrow' aria-hidden='true'></i>" +
										(options.getAdvancedControlHasLabel() ? $translate.instant('OpenLayers.olGeolocation.label') : "") +
									"</span>");
		
		var geolocate = new mycontrol.olGeolocationControl({
				/**  Class name. **/
				className: "ol-geolocation",
				/** Text label to use for the button. Default is E. Instead of text, also a Node (e.g. a span element) can be used. **/
			  	label: label[0],
				/** Text label to use for the button tip. Default is "Tracking" **/
				tipLabel: $translate.instant('OpenLayers.olGeolocation.tipLabel')
			});
		
		return geolocate;
	}// close createGeolocationControl
	
	/**
	 * ol.Geolocation :
	 *  Classe di supporto per fornire funzionalità di HTML5 Geolocation. 
	 *  L'API Geolocation viene utilizzato per individuare la posizione di un utente.
	 *  Per ricevere la notifica di cambiamenti di posizione, registrare un listener per l'evento di modifica generica sull'istanza di ol.Geolocation.
	 * 
	 * NOTA: Il costruttore ol.Geolocation è stato esteso aggiungendo alle proprietà già previste la proprietà "geolocateZoom".
	 * 
	 * @param {@link MapOptions} options
	 */
	this.createolGeolocation = function (options, olMap){
		    
		// Call parent constructor
	    var geolocation = new ol.Geolocation({
	    		/** The projection the position is reported in. **/
		  	  	projection: options.getDestProjection(),
		  	  	/**  Start Tracking. Default is false. **/
		  	  	tracking: false,
		  	  	/** Livello di zoom al quale portare la mappa quando viene geolocalizzata la posizione dell'utente. **/
		  	  	geolocateZoom: options.getGeolocateZoom()
		    });
			// set zoom 
			geolocation.setGeolocateZoom(options.getGeolocateZoom() !== undefined ? options.getGeolocateZoom() : null);
		    
		return geolocation;
	}// close createolExtGeolocation
	
	/**
	 * Un controllo pulsante che, se premuto, attiva/disattiva lo strumento per disegnare su mappa
	 * e misurare la lunghezza dell'arco tracciato.
	 * NOTA: la misura avviene prendendo in considerazione la curvatura terrestre
	 */
	this.createMeasureLengthControl = function (options) {
		
		var measure = new mycontrol.olMeasureLengthControl({
				/**  Class name. **/
				className: "ol-measure-length",
				/** Text label to use for the button. Default is icon. Instead of text, also a Node (e.g. a span element) can be used. **/
			  	label: (options.getAdvancedControlHasLabel() ? $translate.instant('OpenLayers.olMeasureLength.tipLabel') : ""),
				/** Text label to use for the button tip. Default is "Misura della lunghezza" **/
				tipLabel: $translate.instant('OpenLayers.olMeasureLength.tipLabel')
			});
		
		return measure;
	}// close createMeasureLengthControl
	
	/**
     * Un controllo che attiva/disattiva lo strumento per disegnare su mappa un poligono e misurarne la grandezza della superficie.
 	 * NOTA: la misura avviene prendendo in considerazione la curvatura terrestre
	 */
	this.createMeasureAreaControl = function (options) {
		
		var measure = new mycontrol.olMeasureAreaControl({
				/**  Class name. **/
				className: "ol-measure-area",
				/** Text label to use for the button. Default is icon. Instead of text, also a Node (e.g. a span element) can be used. **/
			  	label: (options.getAdvancedControlHasLabel() ? $translate.instant('OpenLayers.olMeasureArea.tipLabel') : ""),
				/** Text label to use for the button tip. Default is "Misura dell'area" **/
				tipLabel: $translate.instant('OpenLayers.olMeasureArea.tipLabel')
			});
		
		return measure;
	}// close createMeasureAreaControl
	
	/**
     * Un controllo che attiva/disattiva lo strumento per disegnare su mappa un cerchio e misurarne la larghezza del diametro e l'angolo.
	 */
	this.createMeasureAzimutControl = function (options) {
		
		var measure = new mycontrol.olMeasureAzimutControl({
				/**  Class name. **/
				className: "ol-measure-azimut",
				/** Text label to use for the button. Default is icon. Instead of text, also a Node (e.g. a span element) can be used. **/
			  	label: (options.getAdvancedControlHasLabel() ? $translate.instant('OpenLayers.olMeasureAzimut.tipLabel') : ""),
				/** Text label to use for the button tip. Default is "Misura azimut" **/
				tipLabel: $translate.instant('OpenLayers.olMeasureAzimut.tipLabel')
			});
		
		return measure;
	}// close createMeasureAzimutControl
	
	/**
     * Un controllo che attiva/disattiva lo strumento per disegnare su mappa la geometria di un punto.
	 * 
	 * @param {@link String} classname (Required)
	 * @param {@link String} icona button (Required)
	 * @param {@link Boolean} withLabel
	 */
	this.createDrawPointControl = function (classname, icona, withLabel) {
		
		var drawPoint = new mycontrol.olDrawPointControl({
				/** icona **/
				icona: icona,
				/**  Class name. **/
				className: classname,
				/** Text label to use for the button tip. Default is "Punto" **/
				tipLabel: $translate.instant('OpenLayers.olDrawPoint.tipLabel'),
				/** Se la label del button oltre l'icona presenta anche il testo */
				withLabel: withLabel
			});
		
		return drawPoint;
	}// close createDrawPointControl
	
	/**
     * Un controllo che attiva/disattiva lo strumento per disegnare su mappa la geometria di una linea.
	 * 
	 * @param {@link String} classname (Required)
	 * @param {@link String} icona button (Required)
	 * @param {@link Boolean} withLabel
	 */
	this.createDrawLineStringControl = function (classname, icona, withLabel) {
		
		var drawLineString = new mycontrol.olDrawLineStringControl({
				/** icona **/
				icona: icona,
				/**  Class name. **/
				className: classname,
				/** Text label to use for the button tip. Default is "Linea" **/
				tipLabel: $translate.instant('OpenLayers.olDrawLinestring.tipLabel'),
				/** Se la label del button oltre l'icona presenta anche il testo */
				withLabel: withLabel
			});
		
		return drawLineString;
	}// close createDrawLineStringControl
	
	/**
     * Un controllo che attiva/disattiva lo strumento per disegnare su mappa la geometria di un poligono.
	 * 
	 * @param {@link String} classname (Required)
	 * @param {@link String} icona button (Required)
	 * @param {@link Boolean} withLabel
	 */
	this.createDrawPolygonControl = function (classname, icona, withLabel) {
		
		var drawPolygon = new mycontrol.olDrawLineStringControl({
				/** icona **/
				icona: icona,
				/**  Class name. **/
				className: classname,
				/** Text label to use for the button tip. Default is "Poligono" **/
				tipLabel: $translate.instant('OpenLayers.olDrawPolygon.tipLabel'),
				/** Se la label del button oltre l'icona presenta anche il testo */
				withLabel: withLabel
			});
		
		return drawPolygon;
	}// close createDrawPolygonControl
	
	/**
     * Un controllo che attiva/disattiva lo strumento per disegnare su mappa la geometria di un cerchio.
	 * 
	 * @param {@link String} classname (Required)
	 * @param {@link String} icona button (Required)
	 * @param {@link Boolean} withLabel
	 */
	this.createDrawCircleControl = function (classname, icona, withLabel) {
		
		var drawCircle = new mycontrol.olDrawCircleControl({
				/** icona **/
				icona: icona,
				/**  Class name. **/
				className: classname,
				/** Text label to use for the button tip. Default is "Cerchio" **/
				tipLabel: $translate.instant('OpenLayers.olDrawCircle.tipLabel'),
				/** Se la label del button oltre l'icona presenta anche il testo */
				withLabel: withLabel
			});
		
		return drawCircle;
	}// close createDrawCircleControl
	
	/**
     * Un controllo che attiva/disattiva lo strumento per la modifica di una geometria.
     * 
     * @param {@link String} classname (Required)
     * @param {@link String} icona button (Required)
	 */
	this.createModifyFeatureControl = function (classname, icona) {
		
		var edit = new mycontrol.olModifyControl({
				/** icona **/
				icona: icona,
				/**  Class name. **/
				className: classname,
				/** Text label to use for the button tip. Default is "Modifica" **/
				tipLabel: $translate.instant('OpenLayers.olModify.tipLabel')
			});
		
		return edit;
	}// close createModifyFeatureControl
	
	/**
     * Un controllo che attiva/disattiva lo strumento per rimuovere la geometria disegnata su mappa utilizzando
     * gli strumenti di edit.
     * 
     * @param {@link String} classname (Required)
     * @param {@link String} icona button (Required)
	 */
	this.createCancelDrawControl = function (classname, icona) {
		
		var cancel = new mycontrol.olCancelDrawControl({
				/** icona **/
				icona: icona,
				/**  Class name. **/
				className: classname,
				/** Text label to use for the button tip. Default is "Elimina geometria" **/
				tipLabel: $translate.instant('OpenLayers.olCancel.tipLabel')
			});
		
		return cancel;
	}// close createCancelDrawControl
	
	/**
     * Controllo di default customizzabile.
     * 
     * @param {@link String} classname (Required)
     * @param {@link String} icona button (Required)
     * @param {@link String} tipLabel, title button
     * @param {@link String} placement, direction tooltip
	 */
	this.createBaseControl = function (classname, icona, tipLabel, placement) {
		
		var base = new mycontrol.olBaseControl({
				/** icona **/
				icona: icona,
				/**  Class name. **/
				className: classname,
				/** Text label to use for the button tip. Default is "Cerca" **/
				tipLabel: tipLabel,
				/** Which direction would you like the tooltip to go? Supports left, right, top, and bottom. Default è top. **/
				placementTooltip: placement
			});
		
		return base;
	}// close createBaseControl

}]);